#include "widget.h"
#include "ui_widget.h"
#include <QListWidgetItem>
#include <QListWidget>
#include <QDebug>

/*
 * TEST: 多元素控件
 * 1. 列表类：QListWidget, QListView
 * 2. 表格类：QTableWidget, QTableView
 * 3. 树形类：QTreeWidget, QTreeView
 *
 * 对于 QTreeWidget 来说
 * 顶层结点可以理解成 List 的结构
 * 1. 通过 addTopLevelItem 来增加顶层结点，每个结点都是一个列表 QTreeWidgetItem
 * 2. 通过 setHeaderLabel 来设置根节点的标签名字
 * 3. 后续给孩子结点增加列表的时候都是通过 addChild 来添加
*/

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->list->addItems({"药水哥", "李达康", "彭于晏", "小兰花"});

    // 新增行
    ui->tbl->insertRow(0);
    ui->tbl->insertRow(1);
    ui->tbl->insertRow(2);

    // 新增列
    ui->tbl->insertColumn(0);
    ui->tbl->insertColumn(1);
    ui->tbl->insertColumn(2);

    // 增加水平方向的报头 (也可以对垂直方向的表头进行设置)
    ui->tbl->setHorizontalHeaderItem(0, new QTableWidgetItem("姓名"));
    ui->tbl->setHorizontalHeaderItem(1, new QTableWidgetItem("年龄"));
    ui->tbl->setHorizontalHeaderItem(2, new QTableWidgetItem("学历"));
    // 添加新数据
    ui->tbl->setItem(0, 0, new QTableWidgetItem("A"));
    ui->tbl->setItem(0, 1, new QTableWidgetItem("19"));
    ui->tbl->setItem(0, 2, new QTableWidgetItem("本科"));

    ui->tbl->setItem(1, 0, new QTableWidgetItem("B"));
    ui->tbl->setItem(1, 1, new QTableWidgetItem("9"));
    ui->tbl->setItem(1, 2, new QTableWidgetItem("大专"));
    ui->tbl->setItem(2, 0, new QTableWidgetItem("C"));
    ui->tbl->setItem(2, 1, new QTableWidgetItem("10"));
    ui->tbl->setItem(2, 2, new QTableWidgetItem("中专"));

    /*
     * TreeWidget -------------------------------------------------------
    */

    // 先设置 根节点 标签
    ui->tree->setHeaderLabel("ALL");

    // 设置一个 QTreeWidget 的子项，相当于该结点的列表
    QTreeWidgetItem* cpp = new QTreeWidgetItem();
    cpp->setText(0, "C++");
    // cpp->setText(1, "Desciption"); // 这里可以设置多列布局，表示第二列，一般默认只有一列

    QTreeWidgetItem* java = new QTreeWidgetItem();
    java->setText(0, "Java");

    ui->tree->addTopLevelItem(cpp);
    ui->tree->addTopLevelItem(java);

    // 添加子节点
    QTreeWidgetItem* jvm = new QTreeWidgetItem();
    jvm->setText(0, "JVM");

    QTreeWidgetItem* hashmap = new QTreeWidgetItem();
    hashmap->setText(0, "HashMap");

    java->addChild(hashmap);
    java->addChild(jvm);
}

Widget::~Widget()
{
    delete ui;
}


//void Widget::on_erase_clicked()
//{
//    // 获取被选中的 item 下标
//    auto id = ui->list->currentRow();
//    if (id < 0)	return ;

//    ui->list->takeItem(id);
//}

//void Widget::on_insert_clicked()
//{
//    auto content = ui->edit->text();
//    if (content.size() > 0)
//        ui->list->addItem(content);
//}

// 如果当前选中的 item 变化了
void Widget::on_list_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    if (previous != nullptr) {
        qDebug() << "Pervious Element: " << previous->text();
    }
    if (current != nullptr) {
        qDebug() << "Current Element: " << current->text();
    }
}

// 新增一行
void Widget::on_new_row_clicked()
{
    // 新增一行 (没指定表头名字)
    auto current = ui->tbl->rowCount();
    ui->tbl->insertRow(current);
}

// 删除整行
void Widget::on_erase_row_clicked()
{
    // 获取当前选中的行号
    auto current = ui->tbl->currentRow();
    ui->tbl->removeRow(current);
}

// 新增一列
void Widget::on_new_col_clicked()
{
    auto current = ui->tbl->rowCount();
    ui->tbl->insertColumn(current);

    // 设置列名(水平方向的报头名字)
    ui->tbl->setHorizontalHeaderItem(current, new QTableWidgetItem(ui->edit->text()));
}

// 删除选中列
void Widget::on_erase_col_clicked()
{
    auto current = ui->tbl->currentColumn();
    ui->tbl->removeColumn(current);
}

// 往顶层添加结点
void Widget::on_top_insert_clicked()
{
    auto text = ui->tree_edit->text();
    if (text.isEmpty())	return ;

    QTreeWidgetItem* top = new QTreeWidgetItem();
    top->setText(0, text);

    ui->tree->addTopLevelItem(top);
}

// 在当前结点中添加一个新节点
void Widget::on_insert_clicked()
{
    auto text = ui->tree_edit->text();
    if (text.isEmpty())	return ;

    QTreeWidgetItem* amount = ui->tree->currentItem();
    if (amount == nullptr)	return ;

    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0, text);

    amount->addChild(item);
}

// 删除当前结点，但是需要通过父元素进行删除
void Widget::on_erase_clicked()
{
    auto dead = ui->tree->currentItem();
    if (dead == nullptr)	return ;

    QTreeWidgetItem* parent = ui->tree->currentItem()->parent();
    if (parent == nullptr) {		// 如果是顶层元素，那么需要通过下标来删除
        // 获取当前被删除的顶层元素的下标
        int index = ui->tree->indexOfTopLevelItem(dead);
        ui->tree->takeTopLevelItem(index);
    }
    else {
        parent->removeChild(dead);
    }
}
